package lambda.demo01;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Mr.ma
 * @since 2022/11/3 14:12
 * lambda表达式的核心在于：函数式接口，定义单一抽象方法的接口
 * lambda表达式的特点在于：只关注接口中的抽象方法，对接口名无要求等
 * lambda表达式的用处在于：作为方法的参数使用，替代内部类，使得方法的调用更加简洁
 * lambda表达式与内部类最大的区别在于：lambda表达式在编译后不会生成单独的字节码文件
 **/
public class TestLambda01 {
    public static void main(String[] args) {
        doOther(() -> System.out.println("无参无返回值，且只有右侧只有一条语句，大括号可省"));
        doOther(x -> System.out.println("有参无返回值，且只有一个参数，左侧小括号可省，参数x = " + x), 110);
        doOther((x,y)-> String.valueOf(x.compareTo(y)), 11, 18);
    }
    public static void doOther(VoidLambda voidLambda){
        voidLambda.doSome();
    }
    public static void doOther(OneLambda oneLambda, int i){
        oneLambda.doSome(i);
    }
    public static void doOther(TwoLambda twoLambda, int age01, int age02){
        String s = twoLambda.doSome(age01, age02);
        System.out.println("有参有返回值，且只有一条返回语句时，return关键字和大括号可以省略，注意省略大括号时，必须省略return关键字，返回值s = " + s);
    }
}
@FunctionalInterface
interface VoidLambda {
    /**
     * 无参无返回值
     */
    public void doSome();
}
@FunctionalInterface
interface OneLambda {
    /**
     * 有参有返回值
     * @param integer
     */
    public void doSome(Integer integer);
}
@FunctionalInterface
interface TwoLambda {
    /**
     * 有参有返回值
     * @param age01
     * @param age02
     * @return
     */
    public String doSome(Integer age01, Integer age02);
}
